package com.zhuhjay.service.system.wxmp.strategy;

import com.zhuhjay.common.base.util.SpringContextHolder;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import org.springframework.core.Ordered;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 处理微信消息的策略接口
 * @author ZhuHJay
 * @date 2023/11/12 21:33
 */
public abstract class AbstractMessageStrategy implements Ordered {

    /**
     * 获取消息处理器
     * @param content 消息内容
     * @return 消息处理器
     */
    public static AbstractMessageStrategy getHandler(String content) {
        // 找到所有支持的消息处理器
        List<AbstractMessageStrategy> strategyList = SpringContextHolder
                .getBeansOfType(AbstractMessageStrategy.class).values()
                .stream()
                // 按照优先级排序
                .sorted((Comparator.comparingInt(Ordered::getOrder)))
                .filter(handler -> handler.support(content))
                .collect(Collectors.toList());
        // 找到最合适的消息处理器
        return strategyList.isEmpty() ? null : strategyList.get(0);
    }

    /**
     * 是否支持该消息
     * @param content 消息内容
     * @return 是否支持
     */
    public abstract boolean support(String content);

    /**
     * 处理消息
     * @param wxMessage 微信消息
     * @param wxMpService 微信服务
     * @return 消息回复
     */
    public abstract WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, WxMpService wxMpService);

    /**
     * 设置优先级
     * @return 优先级
     */
    @Override
    public int getOrder() {
        return Byte.MIN_VALUE;
    }
}
